#pragma once
#ifndef _APPROXIMATION_INTERPOLATION_
#define _APPROXIMATION_INTERPOLATION_

// QtCore
#include <QtCore/QList>
#include <QtCore/QVector>
// Локальные
#include "core_global.h"

namespace approximation
{
    class CORE_EXPORT Interpolation
    {
    public:
        //! Список алгоритмов интерполяции.
        enum Algorithm
        {
            Linear      //! Линейная интерполяция.
        };

        //! Инторполяция заданной функции в указанных точках.
        //! \param arguments Координаты точек, вкоторых известны значения функции.
        //! \param values Известные значения функций.
        //! \param points Координаты точек, в которых нужно найти значения функции.
        //! \param algorithm Алгоритм интерполяции.
        //! \return Найденные значения функции.
        //! \remarks Значения списка \e arguments должны быть упорядочены по возрастанию или по убыванию.
        static QList<double> interpolate(const QList<double> &arguments, const QList<double> &values, const QList<double> &points, Algorithm algorithm);

        //! Инторполяция заданной функции.
        //
        //! В качестве точек интерполяции выбираются \e num_of_points точек, равномерно распределенных в диапазоне \f$(arguments_0;arguments_n)\f$
        //! не включая крайние точки диапазона.
        //! \param arguments Координаты точек, вкоторых известны значения функции.
        //! \param values Известные значения функций.
        //! \param num_of_points Число точек внутри диапазона \f$(arguments_0;arguments_n)\f$, в которых надо найти значения функции.
        //! \param algorithm Алгоритм интерполяции.
        //! \return Список пар аргумент-найденное значение функции.
        //! \remarks Значения списка \e arguments должны быть упорядочены по возрастанию или по убыванию.
        static QList< QVector<double> > interpolate(const QList<double> &arguments, const QList<double> &values, int num_of_points, Algorithm algorithm);

    private:
        //! Линейная инторполяция заданной функции в указанных точках.
        //! \param arguments Координаты точек, вкоторых известны значения функции.
        //! \param values Известные значения функций.
        //! \param points Координаты точек, в которых нужно найти значения функции.
        //! \param algorithm Алгоритм интерполяции.
        //! \return Найденные значения функции.
        //! \remarks Значения списка \e arguments должны быть упорядочены по возрастанию или по убыванию.
        static QList<double> linearInterpolation(const QList<double> &arguments, const QList<double> &values, const QList<double> &points);
    };
}

#endif // _APPROXIMATION_INTERPOLATION_
